#ifndef COMMON_H
#define COMMON_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MAX_BUFFER_SIZE 10240
#define PACKET_HEADER_SIZE 12
#define MAGIC_NUMBER 0xABCD

// 数据包头结构
typedef struct {
    unsigned short magic;      // 魔术字，用于识别数据包
    unsigned int dataLength;   // JSON数据长度
    unsigned char dataType;    // 数据类型
    unsigned char flags;       // 标志位
    unsigned short reserved;   // 保留字段
} PacketHeader;

// 数据类型枚举
enum DataType {
    DATA_TYPE_SILICON_WAFER = 1,  // 硅片数据
    DATA_TYPE_PRODUCTION = 2,     // 生产数据
    DATA_TYPE_HEARTBEAT = 3,      // 心跳包
    DATA_TYPE_ACK = 4,            // 确认包
    DATA_TYPE_ERROR = 5,          // 错误包
    DATA_TYPE_USER_LOGIN = 6,     // 用户登录
    DATA_TYPE_USER_REGISTER = 7,  // 用户注册
    DATA_TYPE_USER_CHANGE_PASSWORD = 8, // 修改密码
    DATA_TYPE_USER_DELETE = 9,    // 删除用户
    DATA_TYPE_USER_QUERY = 10,    // 查询用户
    DATA_TYPE_DATA_QUERY = 11,    // 数据查询
    DATA_TYPE_DATA_DELETE = 12,   // 数据删除
    DATA_TYPE_DATA_SAMPLE = 13,   // 申请抽查数据
    DATA_TYPE_DATA_ERROR_REPORT = 14, // 上传错误数据编号
    DATA_TYPE_DATA_SAVE = 15,     // 保存数据
    DATA_TYPE_DATA_LOCAL_QUERY = 16 // 查询本地数据
};

// 特殊字符，用于解决粘包问题
#define START_DELIMITER 0x01  // 开始分隔符
#define END_DELIMITER 0x02    // 结束分隔符

// 错误码枚举
enum ErrorCode {
    ERROR_SUCCESS = 0,
    ERROR_INVALID_PACKET = 1,
    ERROR_JSON_PARSE = 2,
    ERROR_SOCKET = 3,
    ERROR_TIMEOUT = 4,
    ERROR_UNKNOWN = 99
};

// 函数声明
void initPacketHeader(PacketHeader *header, unsigned int dataLength, unsigned char dataType);
int validatePacketHeader(PacketHeader *header);
int sendPacket(int sockfd, unsigned char dataType, const char *jsonData);
int recvPacket(int sockfd, char *jsonBuffer, unsigned int bufferSize, unsigned char *dataType);
int createTCPServer(int port, int backlog);
int connectTCPServer(const char *ipAddress, int port);
void printError(const char *message, int errorCode);

#endif